package br.com.mkmts.dao.jpa.cadastro;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import org.springframework.stereotype.Repository;

import br.com.mkmts.dao.cadastro.ClienteDao;
import br.com.mkmts.dao.jpa.JpaGenericDao;
import br.com.mkmts.dto.ClienteDTO;
import br.com.mkmts.model.ClienteEntity;
import br.com.mkmts.utils.MkmtsUtil;

@Repository
public class ClienteDaoImpl extends JpaGenericDao<ClienteEntity, Integer> implements ClienteDao{

	
	
	@Override
	public List<ClienteDTO> findByFiltroPesquisa(Integer codClienteFiltro,
			String email, String nomeFiltro, Long celularFiltro) {
		
		boolean flagQuery = false;
		
		StringBuilder query = new StringBuilder();
		query.append(SELECT);
		query.append(_ESPACE);
		
		if(codClienteFiltro > 0){
			query.append("WHERE c.codCliente = "+codClienteFiltro);
			query.append(_ESPACE);
			flagQuery = true;
		}
		
		if(!email.equals("")){
			if(flagQuery){
				query.append("AND c.dadosPessoa.email = '"+email+"'");
				query.append(_ESPACE);
			}else{
				query.append("WHERE c.dadosPessoa.email = '"+email+"'");
				query.append(_ESPACE);
				flagQuery = true;
			}
		}

		if(!nomeFiltro.equals("")){
			if(flagQuery){
				query.append("AND c.dadosPessoa.nome LIKE '"+nomeFiltro+"%'");
				query.append(_ESPACE);
			}else{
				query.append("WHERE c.dadosPessoa.nome LIKE '"+nomeFiltro+"%'");
				query.append(_ESPACE);
				flagQuery = true;
			}
		}

		if(celularFiltro > 0){
			if(flagQuery){
				query.append("AND c.dadosPessoa.numCelular = '"+celularFiltro+"'");
				query.append(_ESPACE);
			}else{
				query.append("WHERE c.dadosPessoa.numCelular = '"+celularFiltro+"'");
				query.append(_ESPACE);
				flagQuery = true;
			}
		}
		
		query.append(ORDER_BY);
		
		List<ClienteEntity>listaRetornada = getEntityManager().createQuery(query.toString(), ClienteEntity.class).getResultList();
		return recuperarOcorrencias(listaRetornada);
	}

	@Override
	public boolean existCellPhoneClient(ClienteEntity cliente) {
		StringBuilder builder = new StringBuilder();
		builder.append(SELECT);
		builder.append(_ESPACE);
		builder.append("WHERE c.dadosPessoa.numCelular = "+cliente.getDadosPessoa().getNumCelular());
		builder.append(_ESPACE);
		if(MkmtsUtil.verificaIntegerNulo(cliente.getCodCliente()) > 0 ){
			builder.append("AND c.codCliente <> "+cliente.getCodCliente()+"");
			builder.append(_ESPACE);
		}
		builder.append(ORDER_BY);
		
		try{
			if(getEntityManager().createQuery(builder.toString()).getSingleResult() == null){
				return false;
			}
			return true;
		}catch(NoResultException nre){
			return false;
		}
	}
	
	@Override
	public boolean existEmailClient(ClienteEntity cliente) {
		
		StringBuilder builder = new StringBuilder();
		builder.append(SELECT);
		builder.append(_ESPACE);
		builder.append("WHERE c.dadosPessoa.email = '"+cliente.getDadosPessoa().getEmail()+"'");
		builder.append(_ESPACE);
		if(MkmtsUtil.verificaIntegerNulo(cliente.getCodCliente()) > 0 ){
			builder.append("AND c.codCliente <> "+cliente.getCodCliente()+"");
		}
		builder.append(_ESPACE);
		builder.append(ORDER_BY);
		
		try{
			if(getEntityManager().createQuery(builder.toString()).getSingleResult() == null){
				return false;
			}
			return true;
		}catch(NoResultException nre){
			return false;
		}
		
	}
	
	@Override
	public boolean existsSaleForClient(Integer id) {
		StringBuilder builder = new StringBuilder();
		builder.append(SELECT);
		builder.append(_ESPACE);
		builder.append("WHERE c.codCliente = "+id);
		builder.append(_ESPACE);
		ClienteEntity c = getEntityManager().createQuery(builder.toString(), ClienteEntity.class).getSingleResult();
		try{
			if(c.getDataPrimeiraVenda() == null){
				return false;
			}
			return true;
		}catch(NoResultException nre){
			return false;
		}
	}

	private List<ClienteDTO> recuperarOcorrencias(List<ClienteEntity>listaRetornada){
		List<ClienteDTO> listaSaida = new ArrayList<ClienteDTO>();
		if(!MkmtsUtil.verificaListNullOrEmpty(listaRetornada)){
			for (int i = 0; i < listaRetornada.size(); i++) {
				ClienteDTO dto = new ClienteDTO();
				dto.setCodCliente(listaRetornada.get(i).getCodCliente());
				dto.setDadosPessoa(listaRetornada.get(i).getDadosPessoa());
				dto.setDataPrimeiraVenda(listaRetornada.get(i).getDataPrimeiraVenda());
				dto.setDataUltimaVenda(listaRetornada.get(i).getDataUltimaVenda());
				dto.setInfAdicional(listaRetornada.get(i).getInfAdicional());
				listaSaida.add(dto);
			}
		}
		return listaSaida;
	}
	
}
